package util

import (
	"fmt"
	"math"
)

type Node struct {
	Value int
	Left  *Node
	Right *Node
}

type Tree struct {
	Root *Node
}

// 初始化节点
func NewNode(value int) *Node {
	return &Node{
		Value: value,
		Left:  nil,
		Right: nil,
	}
}

// 初始化树
func NewTree(node *Node) *Tree {
	return &Tree{
		Root: node,
	}
}

// 获取节点值
func (node *Node) GetData() {
	fmt.Printf("%v ", node.Value)
}

var min float64 = math.MaxInt

// 获取最小深度值
func GetMinDepth(node *Node, num float64) (result float64) {
	MinDepth(node, num)
	return min
}

// 最小深度算法
func MinDepth(node *Node, num float64) {
	if node == nil {
		return
	}
	//输出当前节点的值
	node.GetData()

	if node.Left == nil && node.Right == nil {
		//如果该节点是叶子节点，判断当前循环次数和最小路径值并取最小值
		min = math.Min(num, min)
		return
	}
	//如果该节点的左节点不为空，递归继续循环
	if node.Left != nil {
		MinDepth(node.Left, num+1)
	}
	//如果该节点的右节点不为空，递归继续循环
	if node.Right != nil {
		MinDepth(node.Right, num+1)
	}
}
